#-*- coding: UTF-8 -*-
from pyramid.httpexceptions import HTTPFound
from pyramid.security import remember
from pyramid.security import forget

from sqlalchemy import and_
from sqlalchemy import or_
from sqlalchemy.orm import eagerload


from scp.modelo.models import DBSession
from scp.modelo.Tipo_Item import Tipo_Item
from scp.modelo.Rol import Rol
from scp.modelo.Permiso import Permiso
from scp.modelo.Item import Item
from scp.modelo.Fase import Fase
from scp.modelo.ValoresCadena import ValoresCadena
from scp.modelo.ValoresNumerico import ValoresNumerico
from scp.modelo.ValoresFecha import ValoresFecha
from scp.modelo.RelacionP_H import RelacionP_H
from scp.modelo.RelacionA_S import RelacionA_S

from pyramid.response import Response
from pyramid.view import view_config
import json

import re

#@view_config(renderer='json')
def relaciones(request):
	"""Método controlador encargado de la administración de las relaciones.
		URL asociada: /relaciones/{operacion}
		operacion:
			traerItems: retorna los items a relacionar de acuerdo al tipo de relacion
		@param request: Petición Http del cliente. 	
	"""
	
	methodRequest = request.method
		
	dicParametros = request.matchdict
	

	if dicParametros.get('operacion') == 'crear' and request.url.find('?') == -1:
		print 'respondí un diccionario normal'
		return {'content':'Hello!'}	
	
	
	session = DBSession()
	if dicParametros.get('operacion') == 'traerItems':
		tipoRelacion = request.params['tipoRelacion']
		nombreProyecto = request.params['nombreProyecto']
		idFase = request.params['idFase']
		idItem = request.params['idItem']
		
		response = Response()
		if tipoRelacion == 'Padre - Hijo':
			hijo = session.query(RelacionP_H).filter_by(hijo = idItem).first()
			items = session.query(Item).filter(and_(Item.fase_id==request.params['idFase'], Item.flagUltimo == 1, Item.flagBorrado == 0, Item.id != idItem)).all()
			padresArray = []
			if hijo is None:
				for item in items:
					aux = {'idItem':item.id, 'nombreItem':item.nombre}
					padresArray.append(aux)
			response.body = json.dumps(dict(success = True, items = padresArray))
			
		else:
			fase = session.query(Fase).filter_by(id = idFase).first()
			antecesoresArray = []
			if fase.orden > 1:
				faseAnterior = session.query(Fase).filter_by(orden = fase.orden - 1).first()
				items = session.query(Item).filter(and_(Item.fase_id==faseAnterior.id, Item.flagUltimo == 1, Item.flagBorrado == 0, Item.id != idItem)).all()
				for item in items:
					aux = {'idItem':item.id, 'nombreItem':item.nombre}
					antecesoresArray.append(aux)
			response.body = json.dumps(dict(success = True, items = antecesoresArray))
				
		response.content_type = 'application/json'
		
		return response

	if dicParametros.get('operacion') == 'traerItem':
		idItem = request.params['idItem']
		item = session.query(Item).filter_by(id = idItem).first()
		
		response = Response()
		response.body = json.dumps(dict(success = True, item = {'codItem': item.codigo, 'nombreItem': item.nombre, 'versionItem': item.version}))
		response.content_type = 'application/json'
		
		return response
	
	if dicParametros.get('operacion') == 'view':
		idItem = request.params['idItem']
		relacionesArray = []
		
		relaciones = session.query(RelacionP_H).filter(or_(RelacionP_H.padre == idItem, RelacionP_H.hijo == idItem)).all()
		for relacion in relaciones:
			padre = session.query(Item).filter_by(id = relacion.padre, flagUltimo = 1, flagBorrado = 0).first()
			hijo = session.query(Item).filter_by(id = relacion.hijo, flagUltimo = 1, flagBorrado = 0).first()
			duenho = session.query(Item).filter_by(id = relacion.duenho, flagUltimo = 1, flagBorrado = 0).first()
			aux = {'idRelacion': relacion.id, 'padre': padre.nombre, 'hijo': hijo.nombre, 'duenho': duenho.nombre}
			relacionesArray.append(aux)
		
		relaciones = session.query(RelacionA_S).filter(or_(RelacionA_S.antecesor == idItem, RelacionA_S.sucesor == idItem)).all()
		for relacion in relaciones:
			antecesor = session.query(Item).filter_by(id = relacion.antecesor, flagUltimo = 1, flagBorrado = 0).first()
			sucesor = session.query(Item).filter_by(id = relacion.sucesor, flagUltimo = 1, flagBorrado = 0).first()
			duenho = session.query(Item).filter_by(id = relacion.duenho, flagUltimo = 1, flagBorrado = 0).first()
			aux = {'idRelacion': relacion.id, 'antecesor': antecesor.nombre, 'sucesor': sucesor.nombre, 'duenho': duenho.nombre}
			relacionesArray.append(aux)
			
		response = Response()
		response.body = json.dumps(dict(success = True, relaciones = relacionesArray))
		response.content_type = 'application/json'
		
		return response
		
	if dicParametros.get('operacion') == 'create':
		tipoRelacion = request.params['tipoRelacion']
		idItem = request.params['idItem']
		idItemRelacionar = request.params['idItemRelacionar']
		if tipoRelacion == 'Padre - Hijo':
			relacionP_H = RelacionP_H()
			relacionP_H.padre = idItemRelacionar
			relacionP_H.hijo = idItem
			relacionP_H.duenho = idItem
			
			session.add(relacionP_H)
			
		else:
			relacionA_S = RelacionA_S()
			relacionA_S.antecesor = idItemRelacionar
			relacionA_S.sucesor = idItem
			relacionA_S.duenho = idItem
			
			session.add(relacionA_S)
		
		response = Response()
		response.body = json.dumps(dict(success = True))
		response.content_type = 'application/json'
		
		return response
		
